﻿#include "stdafx.h"
#include "Panel.h"

#include "DebugAssert.h"

_NAMESPACE_BEGIN

Panel::Panel()
{
	panel_pParent=NULL;
}

Panel::~Panel()
{
	size_t i=0;
	while(i<plugins.size())
	{
		plugins[i]->Release();
		i++;
	}
	plugins.clear();

	needUpdatePlugins.clear();
}

void Panel::RecievePlug( Panel& p )
{
	std::vector<Panel*>::iterator f=find(plugins.begin(),plugins.end(),&p);
	assert(plugins.end()==f);
	plugins.push_back(&p);
}

void Panel::PlugTo( Panel* parent )
{
	PlugToSilent(parent);
	parent->AddNeedUpdatePlugin(*this);			
}

void Panel::PlugToSilent( Panel* parent )
{
	this->panel_pParent=parent;
	parent->RecievePlug(*this);

	Initial();		
}

Panel* Panel::FindPlugin( CONST_REF(string) name )
{
	size_t i=0;
	while(i<plugins.size())
	{
		if(plugins[i]->panel_name==name)
			return plugins[i];
		i++;
	}
	return NULL;
}

void Panel::Update()
{
	UpdatePlugins();
}

void Panel::UpdatePlugins()
{
	size_t i=0;
	while(i<needUpdatePlugins.size())
	{
		needUpdatePlugins[i]->Update();
		i++;
	}
}

void Panel::AddNeedUpdatePlugin( Panel& p )
{
	needUpdatePlugins.push_back(&p);
}

//////////////////////////////////////////////////////////////////////////

ParentPanel::~ParentPanel()
{
	assert(panel_sons.empty());//这里确保子类已经处理过自己的sons，因为有些类不负责删除子物体指针，所以具体逻辑留给子类
}

void ParentPanel::UpdateSons()
{
	size_t i=0;
	while(i<panel_sons.size())
	{
		panel_sons[i]->Update();
		i++;
	}
}

void ParentPanel::AddSon( Panel* p )
{
	std::vector<Panel*>::iterator f=find(panel_sons.begin(),panel_sons.end(),p);
	assert(panel_sons.end()==f);

	panel_sons.push_back(p);
	p->panel_pParent=this;
	for (std::vector<Panel*>::iterator i=p->GetPlugins().begin();i!=p->GetPlugins().end();i++)
	{
		(*i)->OnParentAddTo();
	}		
}

void ParentPanel::Update()
{
	Panel::Update();
	UpdateSons();
}

void ParentPanel::RemoveSon( Panel* p )
{
	std::vector<Panel*>::iterator f=std::find(panel_sons.begin(),panel_sons.end(),p);
	if(f!=panel_sons.end())
	{
		for (std::vector<Panel*>::iterator i=p->GetPlugins().begin();i!=p->GetPlugins().end();i++)
		{
			(*i)->OnParentRemove();
		}	

		panel_sons.erase(f);	
	}
}

_NAMESPACE_END